#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    struct Node *prev;
    struct Node *next;
    int data;
} Node;

typedef struct Quene {
    Node *front;
    Node *rear;
} Quene;

Node *createNode(int data) {
    Node *node = (Node *)malloc(sizeof(Node));
    node->data = data;
    node->prev = NULL;
    node->next = NULL;
    return node;
}

Quene *createQuene() {
    Quene *quene = (Quene *)malloc(sizeof(Quene));
    quene->front = NULL;
    quene->rear = NULL;
    printf("成功创建链表\n");
    return quene;
}

bool isEmpty(Quene *quene) { return quene->rear == NULL; }

void enQuene(Quene *quene, int data) {
    Node *node = createNode(data);
    if (isEmpty(quene)) {
        quene->front = node;
        quene->rear = node;
    } else {
        node->prev = quene->rear;
        quene->rear->next = node;
        quene->rear = node;
    }
    printf("%d入队\n", data);
}

void deQuene(Quene *quene) {
    if (isEmpty(quene)) {
        printf("队空\n");
    } else {
        Node *temp = quene->front;
        int data = temp->data;
        quene->front = quene->front->next;
        if (quene->front != NULL) {
            quene->front->prev = NULL;
        } else {
            quene->rear = NULL;
        }
        free(temp);
        printf("%d出队\n", data);
    }
}

int main() {
    Quene *quene = createQuene();
    enQuene(quene, 1);
    enQuene(quene, 2);
    enQuene(quene, 3);
    enQuene(quene, 4);
    deQuene(quene);
    deQuene(quene);
    deQuene(quene);
    deQuene(quene);
    deQuene(quene);
}